﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using DevComponents.DotNetBar;

namespace QLThuChi.OtherForms
{
    #region Using
    using QLThuChi.Helpers;
    using QLThuChi.Models;
    using QLThuChi.Repositories;
    #endregion

    /// <summary>
    /// tuansl added: manage loai don vi corresponding with menus in app
    /// </summary>
    public partial class FrmQuanLyNguoiDung: Office2007Form
    {
        // tuansl added: event handler to transfer data to other forms
        public EventHandler Handler { get; set; }
        // Hidden files are used to store ids 
        private DevComponents.DotNetBar.Controls.TextBoxX txtMaLoaiNguoiDung;
        // ---------------- E -----------------

        public FrmQuanLyNguoiDung(bool enableChon = false)
        {
            InitializeComponent();
            InitHiddenFields();
            InitGridView();
            btnChon.Enabled = enableChon;
        }

        /// <summary>
        /// Init structure of gridview
        /// </summary>
        private void InitGridView()
        {
            dtgvDataList.AutoGenerateColumns = false;
            dtgvDataList.Columns.Clear();

            DataGridViewTextBoxColumn objColumn = new DataGridViewTextBoxColumn
            {
                HeaderText = "Mã người dùng",
                DataPropertyName = "MaNguoiDung",
                Name = "MaNguoiDung",
                Width = (int)((dtgvDataList.Width - dtgvDataList.RowHeadersWidth) * 0.2)
            };
            dtgvDataList.Columns.Add(objColumn);

            objColumn = new DataGridViewTextBoxColumn
            {
                HeaderText = "Tên người dùng",
                DataPropertyName = "TenNguoiDung",
                Name = "TenNguoiDung",
                Width = (int)((dtgvDataList.Width - dtgvDataList.RowHeadersWidth) * 0.4 - 1)
            };
            dtgvDataList.Columns.Add(objColumn);

            objColumn = new DataGridViewTextBoxColumn
            {
                HeaderText = "Tên đăng nhập",
                DataPropertyName = "TenDangNhap",
                Name = "TenDangNhap",
                Width = (int)((dtgvDataList.Width - dtgvDataList.RowHeadersWidth) * 0.2 - 1)
            };
            dtgvDataList.Columns.Add(objColumn);

            objColumn = new DataGridViewTextBoxColumn
            {
                HeaderText = "Loại người dùng",
                DataPropertyName = "TenLoaiNguoiDung",
                Name = "TenLoaiNguoiDung",
                Width = (int)((dtgvDataList.Width - dtgvDataList.RowHeadersWidth) * 0.2 - 1)
            };
            dtgvDataList.Columns.Add(objColumn);
        }

        /// <summary>
        /// Init hidden fields
        /// </summary>
        public void InitHiddenFields()
        {
            // Add a new textbox
            txtMaLoaiNguoiDung = new DevComponents.DotNetBar.Controls.TextBoxX
            {
                Name = "txtMaLoaiNguoiDung",
                Text = ""
            };
            txtMaLoaiNguoiDung.Visible = false;

        }

        private void FrmQuanLyNguoiDung_Load(object sender, EventArgs e)
        {
            LoadData();
            // No choose any item
            dtgvDataList.ClearSelection();
        }

        private void btnThemMoi_Click(object sender, EventArgs e)
        {
            var errorText = "";
            if (!ValidateInput(EnumUpdateMode.INSERT, ref errorText))
            {
                MessageBox.Show(errorText, "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            if (ActionAdd())
            {
                if (NguoiDungRepository.SelectAll().Count == 1)
                {
                    MessageBox.Show("Ngưởi dùng đầu tiên đã được tạo.\nHãy khởi động lại chương trình để xác lập cấu hình hệ thống!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    Application.Exit();
                }
                else
                {
                    MessageBox.Show("Lưu dữ liệu thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    LoadData();
                }
            }
            else
            {
                MessageBox.Show("Lưu dữ liệu thất bại", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void btnXoa_Click(object sender, EventArgs e)
        {
            var errorText = "";
            if (!ValidateInput(EnumUpdateMode.DELETE, ref errorText))
            {
                MessageBox.Show(errorText, "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            if (MessageBox.Show("Bạn có chắc chắn xóa dòng này không?", "Xóa", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
            {
                if (ActionDelete())
                {
                    MessageBox.Show("Xóa dữ liệu thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    LoadData();
                }
                else
                {
                    MessageBox.Show("Xóa dữ liệu thất bại", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }

        private void btnLuu_Click(object sender, EventArgs e)
        {
            var errorText = "";
            if (!ValidateInput(EnumUpdateMode.UPDATE, ref errorText))
            {
                MessageBox.Show(errorText, "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            if (ActionUpdate())
            {
                MessageBox.Show("Cập nhật dữ liệu thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                LoadData();
            }
            else
            {
                MessageBox.Show("Cập nhật dữ liệu thất bại", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void btnThoat_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void btnReset_Click(object sender, EventArgs e)
        {
            txtMaNguoiDung.Text = "";
            txtTenNguoiDung.Text = "";
        }

        private void btnChon_Click(object sender, EventArgs e)
        {
            var errorText = "";
            if (!ValidateInput(EnumUpdateMode.CHOOSING, ref errorText))
            {
                MessageBox.Show(errorText, "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            var id = int.Parse(txtMaNguoiDung.Text);
            var name = NguoiDungRepository.SelectByID(id).TenNguoiDung;
            TransferDataInfo(this, new MyEvent(id + "#" + name));
        }

        /// <summary>
        /// Load data from DB
        /// </summary>
        private void LoadData()
        {
            var lstItem = NguoiDungRepository.SelectAll();

            var dt = new DataTable();
            dt.Columns.Add("MaNguoiDung");
            dt.Columns.Add("TenNguoiDung");
            dt.Columns.Add("TenDangNhap");
            dt.Columns.Add("TenLoaiNguoiDung");

            for (int i = 0; i < lstItem.Count; i++)
            {
                dt.Rows.Add(lstItem[i].MaNguoiDung, lstItem[i].TenNguoiDung, lstItem[i].TenDangNhap, lstItem[i].LoaiNguoiDung.TenLoaiNguoiDung);
            }

            DataView objTimeSheetDV = new System.Data.DataView(dt);
            objTimeSheetDV.AllowNew = false;
            dtgvDataList.AutoGenerateColumns = false;
            dtgvDataList.DataSource = objTimeSheetDV;

            dtgvDataList.ClearSelection();
        }

        /// <summary>
        /// Validate user input
        /// </summary>
        /// <param name="isUpdate"></param>
        /// <returns></returns>
        private bool ValidateInput(EnumUpdateMode mode, ref string errorText)
        {
            // Mode update -> checking MaNguoiDung is exists on textbox
            if (mode == EnumUpdateMode.UPDATE || mode == EnumUpdateMode.DELETE || mode == EnumUpdateMode.CHOOSING)
            {
                if (txtMaNguoiDung.Text == "")
                {
                    errorText = "Vui lòng chọn người dùng";
                    return false;
                }
            }
            if (mode != EnumUpdateMode.DELETE)
            {
                if (txtTenNguoiDung.Text == "")
                {
                    errorText = "Vui lòng nhập tên người dùng";
                    return false;
                }
                if (txtTenDangNhap.Text == "")
                {
                    errorText = "Vui lòng nhập tên đăng nhập";
                    return false;
                }
                if (txtMatKhau.Text == "")
                {
                    errorText = "Vui lòng nhập tên mật khẩu";
                    return false;
                }
                if (txtMaLoaiNguoiDung.Text == "")
                {
                    errorText = "Vui lòng chọn loại người dùng";
                    return false;
                }
            }

            return true;
        }

        /// <summary>
        /// Add a new item to DB
        /// </summary>
        /// <returns></returns>
        private bool ActionAdd()
        {
            try
            {
                var item = new NguoiDung
                {
                    TenNguoiDung = txtTenNguoiDung.Text,
                    TenDangNhap = txtTenDangNhap.Text,
                    MatKhau = Encryption.Encrypt(txtMatKhau.Text),
                    MaLoaiNguoiDung = int.Parse(txtMaLoaiNguoiDung.Text)
                };
                if (!NguoiDungRepository.Insert(item))
                {
                    return false;
                }
                EraseTextboxes();
                return true;
            }
            catch
            {
                return false;
            }
        }

        /// <summary>
        /// Erase data in textboxes when mode is insert
        /// </summary>
        public void EraseTextboxes()
        {
            txtTenNguoiDung.Text = "";
            txtTenDangNhap.Text = "";
            txtMatKhau.Text = "";
            txtMaLoaiNguoiDung.Text = "";
            txtLoaiNguoiDung.Text = "";
        }

        /// <summary>
        /// Update item with specificed ID
        /// </summary>
        /// <returns></returns>
        private bool ActionUpdate()
        {
            try
            {
                var item = NguoiDungRepository.SelectByID(int.Parse(txtMaNguoiDung.Text));
                item.TenNguoiDung = txtTenNguoiDung.Text;
                item.TenDangNhap = txtTenDangNhap.Text;
                item.MaLoaiNguoiDung = int.Parse(txtMaLoaiNguoiDung.Text);
                return NguoiDungRepository.Save();
            }
            catch
            {
                return false;
            }
        }

        /// <summary>
        /// Delete item with specified ID
        /// </summary>
        /// <returns></returns>
        private bool ActionDelete()
        {
            try
            {
                return NguoiDungRepository.Delete(int.Parse(txtMaNguoiDung.Text));
            }
            catch
            {
                return false;
            }
        }

        /// <summary>
        /// tuansl added: function is used to transfer data when event would be raised
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        public void TransferDataInfo(object sender, MyEvent e)
        {
            this.Close();
            this.Handler(this, e);
        }

        private void btnChonLoaiNguoiDung_Click(object sender, EventArgs e)
        {
            FrmQuanLyLoaiNguoiDung frm = new FrmQuanLyLoaiNguoiDung(true);
            frm.Handler += GetLoaiNguoiDung;
            frm.ShowDialog();
        }

        public void GetLoaiNguoiDung(object sender, EventArgs e)
        {
            var eventType = (MyEvent)e;
            string[] comp = eventType.Data.Split(new char[] { '#' });

            txtMaLoaiNguoiDung.Text = comp[0];
            txtLoaiNguoiDung.Text = comp[1];
        }

        private void dtgvDataList_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (dtgvDataList.SelectedRows == null || dtgvDataList.SelectedRows.Count == 0)
                return;
            txtMaNguoiDung.Text = dtgvDataList.SelectedRows[0].Cells["MaNguoiDung"].Value.ToString();

            var item = NguoiDungRepository.SelectByID(int.Parse(txtMaNguoiDung.Text));

            txtTenNguoiDung.Text = item.TenNguoiDung;
            txtTenDangNhap.Text = item.TenDangNhap;
            txtMatKhau.Text = item.MatKhau;
            txtLoaiNguoiDung.Text = item.LoaiNguoiDung.TenLoaiNguoiDung;
            txtMaLoaiNguoiDung.Text = item.MaLoaiNguoiDung.ToString();
        }
    }
}